#! /usr/bin/python3
# _*_ coding:UTF-8 _*_
'''
    名称:装饰器
    作者:王楠
    日期:2020/03/09
    功能:
        1.0:写装饰器log 函数执行前后进行输出记录
        2.0:装饰器可以传入参数也可以不传参数
'''
import functools
import time


def log(*arg, **k):
    print('log的参数{}'.format(arg))

    def decorator(func):
        @functools.wraps(func)  # 会将下面的函数名字的改为func参数的名字，即更改wrapper的__name__属性为传入的func的__name__属性
        def wrapper(*args, **kw):
            print('begin call %s' % func.__name__)
            f = func(*args, **kw)
            print('end call %s' % func.__name__)
            return f
        print("返回装饰过的%s" % func)
        return wrapper
    return decorator


# @log()
def fast(x, y):
    print('正在运行fast()')
    time.sleep(2)
    return x + y


@log('slow')
def slow(x, y, z):
    print('正在运行slow()')
    time.sleep(5)
    return x + y + z


if __name__ == '__main__':
    # 调用fast() 函数
    print('**********调用fast() 函数***********')
    f = fast(1, 2)
    print(f)
    print('**********调用slow() 函数***********')
    s = slow(1, 2, 3)
    print(s)
    # 装饰fast的过程
    print('**********调用fast() 函数***********')
    de = log('开始装饰fast函数')
    wrap = de(fast)  # wrap就是装饰过后的fast
    ww = wrap(3, 4)
    print(ww)
